//这样写是会报错的 因为我们在person定义了a，b但是对象里面缺少b属性
//使用接口约束的时候不能多一个属性也不能少一个属性
//必须与接口保持一致
// interface Person {
//   b: string
//   a: string
// }

// const person: Person = {
//   a: '213',
//   b: '456',
// }

//重名interface  可以合并
// interface A {
//   name: string
// }
// interface A {
//   age: number
// }
// var x1: A = { name: 'xx', age: 20 }

//继承
interface Am {
  name: string
}

interface Bm extends Am {
  age: number
}

let objm: Bm = {
  age: 18,
  name: 'string',
}

//可选属性 使用?操作符
//可选属性的含义是该属性可以不存在
//所以说这样写也是没问题的
// interface Person {
//   b?: string
//   a: string
// }

// const person: Person = {
//   a: '213',
// }

//在这个例子当中我们看到接口中并没有定义C但是并没有报错
//应为我们定义了[propName: string]: any;
//允许添加新的任意属性
// interface Person {
//   b?: string
//   a: string
//   [propName: string]: any
// }

// const person: Person = {
//   a: '213',
//   c: '123',
// }

//这样写是会报错的
//应为a是只读的不允许重新赋值
// interface Person {
//   b?: string,
//   readonly a: string,
//   [propName: string]: any;
// }

// const person: Person = {
//   a: "213",
//   c: "123"
// }

// person.a = 123

// 添加函数
interface Person1 {
  b?: string
  readonly a: string
  // 任意属性 [propName: string] 一旦定义了任意属性，那么确定属性和可选属性的类型都必须是它的类型的子集：
  [propName: string]: any
  cb: () => void
}

const person1: Person1 = {
  a: '213',
  c: '123',
  cb: () => {
    console.log(123)
  },
}
